--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Release/esptool/gen_esp32part.py master (d39339f8) Text, 22.53 KB
T8b949e#!/usr/bin/env python
T8b949e#
T8b949e# ESP32 partition table generation tool
T8b949e#
T8b949e# Converts partition tables to/from CSV and binary formats.
T8b949e#
T8b949e# See https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/partition-tables.html
T8b949e# for explanation of partition table structure and uses.
T8b949e#
T8b949e# SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD
T8b949e# SPDX-License-Identifier: Apache-2.0
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3divisionTb4b4b4, Te6edf3print_functionTb4b4b4, Te6edf3unicode_literals
Tff7b72import T7ee787argparse
Tff7b72import T7ee787binascii
Tff7b72import T7ee787errno
Tff7b72import T7ee787hashlib
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787struct
Tff7b72import T7ee787sys
Te6edf3MAX_PARTITION_LENGTH Tff7b72= T79c0ff0xC00 T8b949e# 3K for partition data (96 entries) leaves 1K in a 4K sector for signature
Te6edf3MD5_PARTITION_BEGIN Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xEBTffea00\xEBTa5d6ff' Tff7b72+ Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* T79c0ff14 T8b949e# The first 2 bytes are like magic numbers for MD5 sum
Te6edf3PARTITION_TABLE_SIZE Tff7b72= T79c0ff0x1000 T8b949e# Size of partition table
Te6edf3MIN_PARTITION_SUBTYPE_APP_OTA Tff7b72= T79c0ff0x10
Te6edf3NUM_PARTITION_SUBTYPE_APP_OTA Tff7b72= T79c0ff16
Te6edf3__version__ Tff7b72= Ta5d6ff'Ta5d6ff1.2Ta5d6ff'
Te6edf3APP_TYPE Tff7b72= T79c0ff0x00
Te6edf3DATA_TYPE Tff7b72= T79c0ff0x01
Te6edf3TYPES Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffappTa5d6ff'Tb4b4b4: Te6edf3APP_TYPETb4b4b4,
Ta5d6ff'Ta5d6ffdataTa5d6ff'Tb4b4b4: Te6edf3DATA_TYPETb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffget_ptype_as_intTb4b4b4(Te6edf3ptypeTb4b4b4)Tb4b4b4:
T8b949e""" Convert a string which might be numeric or the name of a partition type to an integer """
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3TYPESTb4b4b4[Te6edf3ptypeTb4b4b4]
Tff7b72except Tf85149KeyErrorTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Te6edf3ptypeTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72except Tf85149TypeErrorTb4b4b4:
Tff7b72return Te6edf3ptype
T8b949e# Keep this map in sync with esp_partition_subtype_t enum in esp_partition.h
Te6edf3SUBTYPES Tff7b72= Tb4b4b4{
Te6edf3APP_TYPETb4b4b4: Tb4b4b4{
Ta5d6ff'Ta5d6fffactoryTa5d6ff'Tb4b4b4: T79c0ff0x00Tb4b4b4,
Ta5d6ff'Ta5d6fftestTa5d6ff'Tb4b4b4: T79c0ff0x20Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3DATA_TYPETb4b4b4: Tb4b4b4{
Ta5d6ff'Ta5d6ffotaTa5d6ff'Tb4b4b4: T79c0ff0x00Tb4b4b4,
Ta5d6ff'Ta5d6ffphyTa5d6ff'Tb4b4b4: T79c0ff0x01Tb4b4b4,
Ta5d6ff'Ta5d6ffnvsTa5d6ff'Tb4b4b4: T79c0ff0x02Tb4b4b4,
Ta5d6ff'Ta5d6ffcoredumpTa5d6ff'Tb4b4b4: T79c0ff0x03Tb4b4b4,
Ta5d6ff'Ta5d6ffnvs_keysTa5d6ff'Tb4b4b4: T79c0ff0x04Tb4b4b4,
Ta5d6ff'Ta5d6ffefuseTa5d6ff'Tb4b4b4: T79c0ff0x05Tb4b4b4,
Ta5d6ff'Ta5d6ffundefinedTa5d6ff'Tb4b4b4: T79c0ff0x06Tb4b4b4,
Ta5d6ff'Ta5d6ffesphttpdTa5d6ff'Tb4b4b4: T79c0ff0x80Tb4b4b4,
Ta5d6ff'Ta5d6fffatTa5d6ff'Tb4b4b4: T79c0ff0x81Tb4b4b4,
Ta5d6ff'Ta5d6ffspiffsTa5d6ff'Tb4b4b4: T79c0ff0x82Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffget_subtype_as_intTb4b4b4(Te6edf3ptypeTb4b4b4, Te6edf3subtypeTb4b4b4)Tb4b4b4:
T8b949e""" Convert a string which might be numeric or the name of a partition subtype to an integer """
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3SUBTYPESTb4b4b4[Te6edf3get_ptype_as_intTb4b4b4(Te6edf3ptypeTb4b4b4)Tb4b4b4]Tb4b4b4[Te6edf3subtypeTb4b4b4]
Tff7b72except Tf85149KeyErrorTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Te6edf3subtypeTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72except Tf85149TypeErrorTb4b4b4:
Tff7b72return Te6edf3subtype
Te6edf3ALIGNMENT Tff7b72= Tb4b4b4{
Te6edf3APP_TYPETb4b4b4: T79c0ff0x10000Tb4b4b4,
Te6edf3DATA_TYPETb4b4b4: T79c0ff0x1000Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffget_alignment_for_typeTb4b4b4(Te6edf3ptypeTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3ALIGNMENTTff7b72.Td2a8ffgetTb4b4b4(Te6edf3ptypeTb4b4b4, Te6edf3ALIGNMENTTb4b4b4[Te6edf3DATA_TYPETb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffget_partition_typeTb4b4b4(Te6edf3ptypeTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3ptype Tff7b72== Ta5d6ff'Ta5d6ffappTa5d6ff'Tb4b4b4:
Tff7b72return Te6edf3APP_TYPE
Tff7b72if Te6edf3ptype Tff7b72== Ta5d6ff'Ta5d6ffdataTa5d6ff'Tb4b4b4:
Tff7b72return Te6edf3DATA_TYPE
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid partition typeTa5d6ff'Tb4b4b4)
Tff7b72def Td2a8ffadd_extra_subtypesTb4b4b4(Te6edf3csvTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3line_no Tff7b72in Te6edf3csvTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fields Tff7b72= Tb4b4b4[Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3line Tff7b72in Te6edf3line_noTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff,Ta5d6ff'Tb4b4b4)Tb4b4b4]
Tff7b72for Te6edf3subtypeTb4b4b4, Te6edf3subtype_values Tff7b72in Te6edf3SUBTYPESTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(Tffa657intTb4b4b4(Te6edf3fieldsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, T79c0ff16Tb4b4b4) Tff7b72in Te6edf3subtype_valuesTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3subtype Tff7b72== Te6edf3get_partition_typeTb4b4b4(Te6edf3fieldsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff'Ta5d6ffFound duplicate value in partition subtypeTa5d6ff'Tb4b4b4)
Te6edf3SUBTYPESTb4b4b4[Te6edf3TYPESTb4b4b4[Te6edf3fieldsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4]Tb4b4b4]Tb4b4b4[Te6edf3fieldsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4] Tff7b72= Tffa657intTb4b4b4(Te6edf3fieldsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, T79c0ff16Tb4b4b4)
Tff7b72except Te6edf3InputError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffError parsing custom subtypes: Tffd700%sTa5d6ff' Tff7b72% Te6edf3errTb4b4b4)
Te6edf3quiet Tff7b72= Tff7b72False
Te6edf3md5sum Tff7b72= Tff7b72True
Te6edf3secure Tff7b72= Tff7b72False
Te6edf3offset_part_table Tff7b72= T79c0ff0
Tff7b72def Td2a8ffstatusTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
T8b949e""" Print status message to stderr """
Tff7b72if Tff7b72not Te6edf3quietTb4b4b4:
Te6edf3criticalTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72def Td2a8ffcriticalTb4b4b4(Te6edf3msgTb4b4b4)Tb4b4b4:
T8b949e""" Print critical message to stderr """
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff'Tffea00\nTa5d6ff'Tb4b4b4)
Tff7b72class T56d364PartitionTableTb4b4b4(Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Te6edf3PartitionTableTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4)
Tf0883e@classmethod
Tff7b72def Td2a8fffrom_fileTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3fTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3data_is_binary Tff7b72= Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4:T79c0ff2Tb4b4b4] Tff7b72== Te6edf3PartitionDefinitionTff7b72.Td2a8ffMAGIC_BYTES
Tff7b72if Te6edf3data_is_binaryTb4b4b4:
Te6edf3statusTb4b4b4(Ta5d6ff'Ta5d6ffParsing binary partition input...Ta5d6ff'Tb4b4b4)
Tff7b72return Tff7b72clsTff7b72.Td2a8fffrom_binaryTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4, Tff7b72True
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Te6edf3statusTb4b4b4(Ta5d6ff'Ta5d6ffParsing CSV input...Ta5d6ff'Tb4b4b4)
Tff7b72return Tff7b72clsTff7b72.Td2a8fffrom_csvTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4, Tff7b72False
Tf0883e@classmethod
Tff7b72def Td2a8fffrom_csvTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3csv_contentsTb4b4b4)Tb4b4b4:
Te6edf3res Tff7b72= Te6edf3PartitionTableTb4b4b4(Tb4b4b4)
Te6edf3lines Tff7b72= Te6edf3csv_contentsTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffexpand_varsTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4:
Te6edf3f Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpandvarsTb4b4b4(Te6edf3fTb4b4b4)
Te6edf3m Tff7b72= Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Ta5d6ffrTa5d6ff'Ta5d6ff(?<!Tffea00\\Ta5d6ff)Ta5d6ff\Ta5d6ff$([A-Za-z_][A-Za-z0-9_]*)Ta5d6ff'Tb4b4b4, Te6edf3fTb4b4b4)
Tff7b72if Te6edf3mTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff"Ta5d6ffunknown variable Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff" Tff7b72% Te6edf3mTff7b72.Td2a8ffgroupTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3f
Tff7b72for Te6edf3line_no Tff7b72in Tffa657rangeTb4b4b4(Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3line Tff7b72= Te6edf3expand_varsTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3line_noTb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff'Ta5d6ff#Ta5d6ff'Tb4b4b4) Tff7b72or Tffa657lenTb4b4b4(Te6edf3lineTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3resTff7b72.Td2a8ffappendTb4b4b4(Te6edf3PartitionDefinitionTff7b72.Td2a8fffrom_csvTb4b4b4(Te6edf3lineTb4b4b4, Te6edf3line_no Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4)
Tff7b72except Te6edf3InputError Tff7b72as Te6edf3errTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffError at line Tffd700%dTa5d6ff: Tffd700%sTffea00\nTa5d6ffPlease check extra_partition_subtypes.inc file in build/config directoryTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3line_no Tff7b72+ T79c0ff1Tb4b4b4, Te6edf3errTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3criticalTb4b4b4(Ta5d6ff'Ta5d6ffUnexpected error parsing CSV line Tffd700%dTa5d6ff: Tffd700%sTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3line_no Tff7b72+ T79c0ff1Tb4b4b4, Te6edf3lineTb4b4b4)Tb4b4b4)
Tff7b72raise
T8b949e# fix up missing offsets & negative sizes
Te6edf3last_end Tff7b72= Te6edf3offset_part_table Tff7b72+ Te6edf3PARTITION_TABLE_SIZE T8b949e# first offset after partition table
Tff7b72for Te6edf3e Tff7b72in Te6edf3resTb4b4b4:
Tff7b72if Te6edf3eTff7b72.Td2a8ffoffset Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3eTff7b72.Td2a8ffoffset Tff7b72< Te6edf3last_endTb4b4b4:
Tff7b72if Te6edf3e Tff7b72== Te6edf3resTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffCSV Error at line Tffd700%dTa5d6ff: Partitions overlap. Partition sets offset 0xTffd700%xTa5d6ff. Ta5d6ff'
Ta5d6ff'Ta5d6ffBut partition table occupies the whole sector 0xTffd700%xTa5d6ff. Ta5d6ff'
Ta5d6ff'Ta5d6ffUse a free offset 0xTffd700%xTa5d6ff or higher.Ta5d6ff'
Tff7b72% Tb4b4b4(Te6edf3eTff7b72.Td2a8ffline_noTb4b4b4, Te6edf3eTff7b72.Td2a8ffoffsetTb4b4b4, Te6edf3offset_part_tableTb4b4b4, Te6edf3last_endTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffCSV Error at line Tffd700%dTa5d6ff: Partitions overlap. Partition sets offset 0xTffd700%xTa5d6ff. Previous partition ends 0xTffd700%xTa5d6ff'
Tff7b72% Tb4b4b4(Te6edf3eTff7b72.Td2a8ffline_noTb4b4b4, Te6edf3eTff7b72.Td2a8ffoffsetTb4b4b4, Te6edf3last_endTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3eTff7b72.Td2a8ffoffset Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3pad_to Tff7b72= Te6edf3get_alignment_for_typeTb4b4b4(Te6edf3eTff7b72.Td2a8fftypeTb4b4b4)
Tff7b72if Te6edf3last_end Tff7b72% Te6edf3pad_to Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3last_end Tff7b72+Tff7b72= Te6edf3pad_to Tff7b72- Tb4b4b4(Te6edf3last_end Tff7b72% Te6edf3pad_toTb4b4b4)
Te6edf3eTff7b72.Td2a8ffoffset Tff7b72= Te6edf3last_end
Tff7b72if Te6edf3eTff7b72.Td2a8ffsize Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3eTff7b72.Td2a8ffsize Tff7b72= Tff7b72-Te6edf3eTff7b72.Td2a8ffsize Tff7b72- Te6edf3eTff7b72.Td2a8ffoffset
Te6edf3last_end Tff7b72= Te6edf3eTff7b72.Td2a8ffoffset Tff7b72+ Te6edf3eTff7b72.Td2a8ffsize
Tff7b72return Te6edf3res
Tff7b72def Tff7b72__getitem__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3itemTb4b4b4)Tb4b4b4:
T8b949e""" Allow partition table access via name as well as by
numeric index. """
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3itemTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3x Tff7b72in Tff7b72selfTb4b4b4:
Tff7b72if Te6edf3xTff7b72.Td2a8ffname Tff7b72== Te6edf3itemTb4b4b4:
Tff7b72return Te6edf3x
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo partition entry named Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff" Tff7b72% Te6edf3itemTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Tffa657superTb4b4b4(Te6edf3PartitionTableTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__getitem__Tb4b4b4(Te6edf3itemTb4b4b4)
Tff7b72def Td2a8fffind_by_typeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ptypeTb4b4b4, Te6edf3subtypeTb4b4b4)Tb4b4b4:
T8b949e""" Return a partition by type & subtype, returns
None if not found """
T8b949e# convert ptype & subtypes names (if supplied this way) to integer values
Te6edf3ptype Tff7b72= Te6edf3get_ptype_as_intTb4b4b4(Te6edf3ptypeTb4b4b4)
Te6edf3subtype Tff7b72= Te6edf3get_subtype_as_intTb4b4b4(Te6edf3ptypeTb4b4b4, Te6edf3subtypeTb4b4b4)
Tff7b72for Te6edf3p Tff7b72in Tff7b72selfTb4b4b4:
Tff7b72if Te6edf3pTff7b72.Td2a8fftype Tff7b72== Te6edf3ptype Tff7b72and Te6edf3pTff7b72.Td2a8ffsubtype Tff7b72== Te6edf3subtypeTb4b4b4:
Tff7b72yield Te6edf3p
Tff7b72return
Tff7b72def Td2a8fffind_by_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3p Tff7b72in Tff7b72selfTb4b4b4:
Tff7b72if Te6edf3pTff7b72.Td2a8ffname Tff7b72== Te6edf3nameTb4b4b4:
Tff7b72return Te6edf3p
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffverifyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# verify each partition individually
Tff7b72for Te6edf3p Tff7b72in Tff7b72selfTb4b4b4:
Te6edf3pTff7b72.Td2a8ffverifyTb4b4b4(Tb4b4b4)
T8b949e# check on duplicate name
Te6edf3names Tff7b72= Tb4b4b4[Te6edf3pTff7b72.Td2a8ffname Tff7b72for Te6edf3p Tff7b72in Tff7b72selfTb4b4b4]
Te6edf3duplicates Tff7b72= Tffa657setTb4b4b4(Te6edf3n Tff7b72for Te6edf3n Tff7b72in Te6edf3names Tff7b72if Te6edf3namesTff7b72.Td2a8ffcountTb4b4b4(Te6edf3nTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4)
T8b949e# print sorted duplicate partitions by name
Tff7b72if Tffa657lenTb4b4b4(Te6edf3duplicatesTb4b4b4) Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3criticalTb4b4b4(Ta5d6ff'Ta5d6ffA list of partitions that have the same name:Ta5d6ff'Tb4b4b4)
Tff7b72for Te6edf3p Tff7b72in Tffa657sortedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3xTb4b4b4:Te6edf3xTff7b72.Td2a8ffnameTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3duplicatesTff7b72.Td2a8ffintersectionTb4b4b4(Tb4b4b4[Te6edf3pTff7b72.Td2a8ffnameTb4b4b4]Tb4b4b4)Tb4b4b4) Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3criticalTb4b4b4(Ta5d6ff'Tffd700%sTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3pTff7b72.Td2a8ffto_csvTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffPartition names must be uniqueTa5d6ff'Tb4b4b4)
T8b949e# check for overlaps
Te6edf3last Tff7b72= Tff7b72None
Tff7b72for Te6edf3p Tff7b72in Tffa657sortedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3xTb4b4b4:Te6edf3xTff7b72.Td2a8ffoffsetTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3pTff7b72.Td2a8ffoffset Tff7b72< Te6edf3offset_part_table Tff7b72+ Te6edf3PARTITION_TABLE_SIZETb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffPartition offset 0xTffd700%xTa5d6ff is below 0xTffd700%xTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3pTff7b72.Td2a8ffoffsetTb4b4b4, Te6edf3offset_part_table Tff7b72+ Te6edf3PARTITION_TABLE_SIZETb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3last Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3pTff7b72.Td2a8ffoffset Tff7b72< Te6edf3lastTff7b72.Td2a8ffoffset Tff7b72+ Te6edf3lastTff7b72.Td2a8ffsizeTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffPartition at 0xTffd700%xTa5d6ff overlaps 0xTffd700%xTa5d6ff-0xTffd700%xTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3pTff7b72.Td2a8ffoffsetTb4b4b4, Te6edf3lastTff7b72.Td2a8ffoffsetTb4b4b4, Te6edf3lastTff7b72.Td2a8ffoffset Tff7b72+ Te6edf3lastTff7b72.Td2a8ffsize Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3last Tff7b72= Te6edf3p
T8b949e# check that otadata should be unique
Te6edf3otadata_duplicates Tff7b72= Tb4b4b4[Te6edf3p Tff7b72for Te6edf3p Tff7b72in Tff7b72self Tff7b72if Te6edf3pTff7b72.Td2a8fftype Tff7b72== Te6edf3TYPESTb4b4b4[Ta5d6ff'Ta5d6ffdataTa5d6ff'Tb4b4b4] Tff7b72and Te6edf3pTff7b72.Td2a8ffsubtype Tff7b72== Te6edf3SUBTYPESTb4b4b4[Te6edf3DATA_TYPETb4b4b4]Tb4b4b4[Ta5d6ff'Ta5d6ffotaTa5d6ff'Tb4b4b4]Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3otadata_duplicatesTb4b4b4) Tff7b72> T79c0ff1Tb4b4b4:
Tff7b72for Te6edf3p Tff7b72in Te6edf3otadata_duplicatesTb4b4b4:
Te6edf3criticalTb4b4b4(Ta5d6ff'Tffd700%sTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3pTff7b72.Td2a8ffto_csvTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffFound multiple otadata partitions. Only one partition can be defined with type=Ta5d6ff"Ta5d6ffdataTa5d6ff"Ta5d6ff(1) and subtype=Ta5d6ff"Ta5d6ffotaTa5d6ff"Ta5d6ff(0).Ta5d6ff'Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3otadata_duplicatesTb4b4b4) Tff7b72== T79c0ff1 Tff7b72and Te6edf3otadata_duplicatesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffsize Tff7b72!= T79c0ff0x2000Tb4b4b4:
Te6edf3p Tff7b72= Te6edf3otadata_duplicatesTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3criticalTb4b4b4(Ta5d6ff'Tffd700%sTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3pTff7b72.Td2a8ffto_csvTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffotadata partition must have size = 0x2000Ta5d6ff'Tb4b4b4)
Tff7b72def Td2a8ffflash_sizeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e""" Return the size that partitions will occupy in flash
(ie the offset the last partition ends at)
"""
Tff7b72tryTb4b4b4:
Te6edf3last Tff7b72= Tffa657sortedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72except Tf85149IndexErrorTb4b4b4:
Tff7b72return T79c0ff0 T8b949e# empty table!
Tff7b72return Te6edf3lastTff7b72.Td2a8ffoffset Tff7b72+ Te6edf3lastTff7b72.Td2a8ffsize
Tff7b72def Td2a8ffverify_size_fitsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3flash_size_bytesTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e""" Check that partition table fits into the given flash size.
Raises InputError otherwise.
"""
Te6edf3table_size Tff7b72= Tff7b72selfTff7b72.Td2a8ffflash_sizeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3flash_size_bytes Tff7b72< Te6edf3table_sizeTb4b4b4:
Te6edf3mb Tff7b72= T79c0ff1024 Tff7b72* T79c0ff1024
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffPartitions tables occupies Tffd700%.1fTa5d6ffMB of flash (Tffd700%dTa5d6ff bytes) which does not fit in configured Ta5d6ff'
Ta5d6ff"Ta5d6ffflash size Tffd700%dTa5d6ffMB. Change the flash size in menuconfig under the Ta5d6ff'Ta5d6ffSerial Flasher ConfigTa5d6ff'Ta5d6ff menu.Ta5d6ff" Tff7b72%
Tb4b4b4(Te6edf3table_size Tff7b72/ Te6edf3mbTb4b4b4, Te6edf3table_sizeTb4b4b4, Te6edf3flash_size_bytes Tff7b72/ Te6edf3mbTb4b4b4)Tb4b4b4)
Tf0883e@classmethod
Tff7b72def Td2a8fffrom_binaryTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3bTb4b4b4)Tb4b4b4:
Te6edf3md5 Tff7b72= Te6edf3hashlibTff7b72.Td2a8ffmd5Tb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72= Tff7b72clsTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3o Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4,Tffa657lenTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4,T79c0ff32Tb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3bTb4b4b4[Te6edf3oTb4b4b4:Te6edf3o Tff7b72+ T79c0ff32Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72!= T79c0ff32Tb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffPartition table length must be a multiple of 32 bytesTa5d6ff'Tb4b4b4)
Tff7b72if Te6edf3data Tff7b72== Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* T79c0ff32Tb4b4b4:
Tff7b72return Te6edf3result T8b949e# got end marker
Tff7b72if Te6edf3md5sum Tff7b72and Te6edf3dataTb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4] Tff7b72== Te6edf3MD5_PARTITION_BEGINTb4b4b4[Tb4b4b4:T79c0ff2Tb4b4b4]Tb4b4b4: T8b949e# check only the magic number part
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff16Tb4b4b4:Tb4b4b4] Tff7b72== Te6edf3md5Tff7b72.Td2a8ffdigestTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue T8b949e# the next iteration will check for the end marker
Tff7b72elseTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff"Ta5d6ffMD5 checksums donTa5d6ff'Ta5d6fft match! (computed: 0xTffd700%sTa5d6ff, parsed: 0xTffd700%sTa5d6ff)Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3md5Tff7b72.Td2a8ffhexdigestTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3binasciiTff7b72.Td2a8ffhexlifyTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff16Tb4b4b4:Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3md5Tff7b72.Td2a8ffupdateTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3resultTff7b72.Td2a8ffappendTb4b4b4(Te6edf3PartitionDefinitionTff7b72.Td2a8fffrom_binaryTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffPartition table is missing an end-of-table markerTa5d6ff'Tb4b4b4)
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3eTff7b72.Td2a8ffto_binaryTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3e Tff7b72in Tff7b72selfTb4b4b4)
Tff7b72if Te6edf3md5sumTb4b4b4:
Te6edf3result Tff7b72+Tff7b72= Te6edf3MD5_PARTITION_BEGIN Tff7b72+ Te6edf3hashlibTff7b72.Td2a8ffmd5Tb4b4b4(Te6edf3resultTb4b4b4)Tff7b72.Td2a8ffdigestTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72>Tff7b72= Te6edf3MAX_PARTITION_LENGTHTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffBinary partition table length (Tffd700%dTa5d6ff) longer than maxTa5d6ff' Tff7b72% Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4)
Te6edf3result Tff7b72+Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* Tb4b4b4(Te6edf3MAX_PARTITION_LENGTH Tff7b72- Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4) T8b949e# pad the sector, for signing
Tff7b72return Te6edf3result
Tff7b72def Td2a8ffto_csvTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3simple_formattingTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3rows Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff# ESP-IDF Partition TableTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ff# Name, Type, SubType, Offset, Size, FlagsTa5d6ff'Tb4b4b4]
Te6edf3rows Tff7b72+Tff7b72= Tb4b4b4[Te6edf3xTff7b72.Td2a8ffto_csvTb4b4b4(Te6edf3simple_formattingTb4b4b4) Tff7b72for Te6edf3x Tff7b72in Tff7b72selfTb4b4b4]
Tff7b72return Ta5d6ff'Tffea00\nTa5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rowsTb4b4b4) Tff7b72+ Ta5d6ff'Tffea00\nTa5d6ff'
Tff7b72class T56d364PartitionDefinitionTb4b4b4(Tffa657objectTb4b4b4)Tb4b4b4:
Te6edf3MAGIC_BYTES Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xAATffea00\x50Ta5d6ff'
T8b949e# dictionary maps flag name (as used in CSV flags list, property name)
T8b949e# to bit set in flags words in binary format
Te6edf3FLAGS Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffencryptedTa5d6ff'Tb4b4b4: T79c0ff0
Tb4b4b4}
T8b949e# add subtypes for the 16 OTA slot values ("ota_XX, etc.")
Tff7b72for Te6edf3ota_slot Tff7b72in Tffa657rangeTb4b4b4(Te6edf3NUM_PARTITION_SUBTYPE_APP_OTATb4b4b4)Tb4b4b4:
Te6edf3SUBTYPESTb4b4b4[Te6edf3TYPESTb4b4b4[Ta5d6ff'Ta5d6ffappTa5d6ff'Tb4b4b4]Tb4b4b4]Tb4b4b4[Ta5d6ff'Ta5d6ffota_Tffd700%dTa5d6ff' Tff7b72% Te6edf3ota_slotTb4b4b4] Tff7b72= Te6edf3MIN_PARTITION_SUBTYPE_APP_OTA Tff7b72+ Te6edf3ota_slot
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Ta5d6ff'Ta5d6ff'
Tff7b72selfTff7b72.Td2a8fftype Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsubtype Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsize Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffencrypted Tff7b72= Tff7b72False
Tf0883e@classmethod
Tff7b72def Td2a8fffrom_csvTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3lineTb4b4b4, Te6edf3line_noTb4b4b4)Tb4b4b4:
T8b949e""" Parse a line from the CSV """
Te6edf3line_w_defaults Tff7b72= Te6edf3line Tff7b72+ Ta5d6ff'Ta5d6ff,,,,Ta5d6ff' T8b949e# lazy way to support default fields
Te6edf3fields Tff7b72= Tb4b4b4[Te6edf3fTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3f Tff7b72in Te6edf3line_w_defaultsTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff,Ta5d6ff'Tb4b4b4)Tb4b4b4]
Te6edf3res Tff7b72= Te6edf3PartitionDefinitionTb4b4b4(Tb4b4b4)
Te6edf3resTff7b72.Td2a8ffline_no Tff7b72= Te6edf3line_no
Te6edf3resTff7b72.Td2a8ffname Tff7b72= Te6edf3fieldsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3resTff7b72.Td2a8fftype Tff7b72= Te6edf3resTff7b72.Td2a8ffparse_typeTb4b4b4(Te6edf3fieldsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3resTff7b72.Td2a8ffsubtype Tff7b72= Te6edf3resTff7b72.Td2a8ffparse_subtypeTb4b4b4(Te6edf3fieldsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4)
Te6edf3resTff7b72.Td2a8ffoffset Tff7b72= Te6edf3resTff7b72.Td2a8ffparse_addressTb4b4b4(Te6edf3fieldsTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)
Te6edf3resTff7b72.Td2a8ffsize Tff7b72= Te6edf3resTff7b72.Td2a8ffparse_addressTb4b4b4(Te6edf3fieldsTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3resTff7b72.Td2a8ffsize Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff"Ta5d6ffSize field canTa5d6ff'Ta5d6fft be emptyTa5d6ff"Tb4b4b4)
Te6edf3flags Tff7b72= Te6edf3fieldsTb4b4b4[T79c0ff5Tb4b4b4]Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff:Ta5d6ff'Tb4b4b4)
Tff7b72for Te6edf3flag Tff7b72in Te6edf3flagsTb4b4b4:
Tff7b72if Te6edf3flag Tff7b72in Tff7b72clsTff7b72.Td2a8ffFLAGSTb4b4b4:
Tffa657setattrTb4b4b4(Te6edf3resTb4b4b4, Te6edf3flagTb4b4b4, Tff7b72TrueTb4b4b4)
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3flagTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff"Ta5d6ffCSV flag column contains unknown flag Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff" Tff7b72% Tb4b4b4(Te6edf3flagTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3res
Tff7b72def Tff7b72__eq__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffname Tff7b72== Te6edf3otherTff7b72.Td2a8ffname Tff7b72and Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3otherTff7b72.Td2a8fftype \
Tff7b72and Tff7b72selfTff7b72.Td2a8ffsubtype Tff7b72== Te6edf3otherTff7b72.Td2a8ffsubtype Tff7b72and Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72== Te6edf3otherTff7b72.Td2a8ffoffset \
Tff7b72and Tff7b72selfTff7b72.Td2a8ffsize Tff7b72== Te6edf3otherTff7b72.Td2a8ffsize
Tff7b72def Tff7b72__repr__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffmaybe_hexTb4b4b4(Te6edf3xTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff0xTffd700%xTa5d6ff' Tff7b72% Te6edf3x Tff7b72if Te6edf3x Tff7b72is Tff7b72not Tff7b72None Tff7b72else Ta5d6ff'Ta5d6ffNoneTa5d6ff'
Tff7b72return Ta5d6ff"Ta5d6ffPartitionDefinition(Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff, 0xTffd700%xTa5d6ff, 0xTffd700%xTa5d6ff, Tffd700%sTa5d6ff, Tffd700%sTa5d6ff)Ta5d6ff" Tff7b72% Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsubtype Tff7b72or T79c0ff0Tb4b4b4,
Te6edf3maybe_hexTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoffsetTb4b4b4)Tb4b4b4, Te6edf3maybe_hexTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsizeTb4b4b4)Tb4b4b4)
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffPart Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff Tffd700%dTa5d6ff/Tffd700%dTa5d6ff @ 0xTffd700%xTa5d6ff size 0xTffd700%xTa5d6ff" Tff7b72% Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsubtypeTb4b4b4, Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72or Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffsize Tff7b72or Tff7b72-T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ff__cmp__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72- Te6edf3otherTff7b72.Td2a8ffoffset
Tff7b72def Tff7b72__lt__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72< Te6edf3otherTff7b72.Td2a8ffoffset
Tff7b72def Tff7b72__gt__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72> Te6edf3otherTff7b72.Td2a8ffoffset
Tff7b72def Tff7b72__le__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72<Tff7b72= Te6edf3otherTff7b72.Td2a8ffoffset
Tff7b72def Tff7b72__ge__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3otherTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72>Tff7b72= Te6edf3otherTff7b72.Td2a8ffoffset
Tff7b72def Td2a8ffparse_typeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3strvalTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3strval Tff7b72== Ta5d6ff'Ta5d6ff'Tb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff"Ta5d6ffField Ta5d6ff'Ta5d6fftypeTa5d6ff'Ta5d6ff canTa5d6ff'Ta5d6fft be left empty.Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3parse_intTb4b4b4(Te6edf3strvalTb4b4b4, Te6edf3TYPESTb4b4b4)
Tff7b72def Td2a8ffparse_subtypeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3strvalTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3strval Tff7b72== Ta5d6ff'Ta5d6ff'Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3TYPESTb4b4b4[Ta5d6ff'Ta5d6ffappTa5d6ff'Tb4b4b4]Tb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffApp partition cannot have an empty subtypeTa5d6ff'Tb4b4b4)
Tff7b72return Te6edf3SUBTYPESTb4b4b4[Te6edf3DATA_TYPETb4b4b4]Tb4b4b4[Ta5d6ff'Ta5d6ffundefinedTa5d6ff'Tb4b4b4]
Tff7b72return Te6edf3parse_intTb4b4b4(Te6edf3strvalTb4b4b4, Te6edf3SUBTYPESTff7b72.Td2a8ffgetTb4b4b4(Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffparse_addressTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3strvalTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3strval Tff7b72== Ta5d6ff'Ta5d6ff'Tb4b4b4:
Tff7b72return Tff7b72None T8b949e# PartitionTable will fill in default
Tff7b72return Te6edf3parse_intTb4b4b4(Te6edf3strvalTb4b4b4)
Tff7b72def Td2a8ffverifyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftype Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3ValidationErrorTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff'Ta5d6ffType field is not setTa5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsubtype Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3ValidationErrorTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff'Ta5d6ffSubtype field is not setTa5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3ValidationErrorTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff'Ta5d6ffOffset field is not setTa5d6ff'Tb4b4b4)
Te6edf3align Tff7b72= Te6edf3get_alignment_for_typeTb4b4b4(Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72% Te6edf3alignTb4b4b4:
Tff7b72raise Te6edf3ValidationErrorTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff'Ta5d6ffOffset 0xTffd700%xTa5d6ff is not aligned to 0xTffd700%xTa5d6ff' Tff7b72% Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffoffsetTb4b4b4, Te6edf3alignTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsize Tff7b72% Te6edf3align Tff7b72and Te6edf3secure Tff7b72and Tff7b72selfTff7b72.Td2a8fftype Tff7b72== Te6edf3APP_TYPETb4b4b4:
Tff7b72raise Te6edf3ValidationErrorTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff'Ta5d6ffSize 0xTffd700%xTa5d6ff is not aligned to 0xTffd700%xTa5d6ff' Tff7b72% Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffsizeTb4b4b4, Te6edf3alignTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsize Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Te6edf3ValidationErrorTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff'Ta5d6ffSize field is not setTa5d6ff'Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffname Tff7b72in Te6edf3TYPES Tff7b72and Te6edf3TYPESTff7b72.Td2a8ffgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4) Tff7b72!= Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4:
Te6edf3criticalTb4b4b4(Ta5d6ff"Ta5d6ffWARNING: Partition has name Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff which is a partition type, but does not match this partitionTa5d6ff'Ta5d6ffs Ta5d6ff"
Ta5d6ff'Ta5d6fftype (0xTffd700%xTa5d6ff). Mistake in partition table?Ta5d6ff' Tff7b72% Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4)Tb4b4b4)
Te6edf3all_subtype_names Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3names Tff7b72in Tb4b4b4(Te6edf3tTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3t Tff7b72in Te6edf3SUBTYPESTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3all_subtype_names Tff7b72+Tff7b72= Te6edf3names
Tff7b72if Tff7b72selfTff7b72.Td2a8ffname Tff7b72in Te6edf3all_subtype_names Tff7b72and Te6edf3SUBTYPESTff7b72.Td2a8ffgetTb4b4b4(Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4) Tff7b72!= Tff7b72selfTff7b72.Td2a8ffsubtypeTb4b4b4:
Te6edf3criticalTb4b4b4(Ta5d6ff"Ta5d6ffWARNING: Partition has name Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff which is a partition subtype, but this partition has Ta5d6ff"
Ta5d6ff'Ta5d6ffnon-matching type 0xTffd700%xTa5d6ff and subtype 0xTffd700%xTa5d6ff. Mistake in partition table?Ta5d6ff' Tff7b72% Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsubtypeTb4b4b4)Tb4b4b4)
Te6edf3STRUCT_FORMAT Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff<2sBBLL16sLTa5d6ff'
Tf0883e@classmethod
Tff7b72def Td2a8fffrom_binaryTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3bTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3bTb4b4b4) Tff7b72!= T79c0ff32Tb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffPartition definition length must be exactly 32 bytes. Got Tffd700%dTa5d6ff bytes.Ta5d6ff' Tff7b72% Tffa657lenTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4)
Te6edf3res Tff7b72= Tff7b72clsTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3magicTb4b4b4, Te6edf3resTff7b72.Td2a8fftypeTb4b4b4, Te6edf3resTff7b72.Td2a8ffsubtypeTb4b4b4, Te6edf3resTff7b72.Td2a8ffoffsetTb4b4b4,
Te6edf3resTff7b72.Td2a8ffsizeTb4b4b4, Te6edf3resTff7b72.Td2a8ffnameTb4b4b4, Te6edf3flagsTb4b4b4) Tff7b72= Te6edf3structTff7b72.Td2a8ffunpackTb4b4b4(Tff7b72clsTff7b72.Td2a8ffSTRUCT_FORMATTb4b4b4, Te6edf3bTb4b4b4)
Tff7b72if Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff' Tff7b72in Te6edf3resTff7b72.Td2a8ffnameTb4b4b4: T8b949e# strip null byte padding from name string
Te6edf3resTff7b72.Td2a8ffname Tff7b72= Te6edf3resTff7b72.Td2a8ffnameTb4b4b4[Tb4b4b4:Te6edf3resTff7b72.Td2a8ffnameTff7b72.Td2a8ffindexTb4b4b4(Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff'Tb4b4b4)Tb4b4b4]
Te6edf3resTff7b72.Td2a8ffname Tff7b72= Te6edf3resTff7b72.Td2a8ffnameTff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3magic Tff7b72!= Tff7b72clsTff7b72.Td2a8ffMAGIC_BYTESTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid magic bytes (Tffd700%rTa5d6ff) for partition definitionTa5d6ff' Tff7b72% Te6edf3magicTb4b4b4)
Tff7b72for Te6edf3flagTb4b4b4,Te6edf3bit Tff7b72in Tff7b72clsTff7b72.Td2a8ffFLAGSTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3flags Tff7b72& Tb4b4b4(T79c0ff1 Tff7b72<< Te6edf3bitTb4b4b4)Tb4b4b4:
Tffa657setattrTb4b4b4(Te6edf3resTb4b4b4, Te6edf3flagTb4b4b4, Tff7b72TrueTb4b4b4)
Te6edf3flags Tff7b72&Tff7b72= Tff7b72~Tb4b4b4(T79c0ff1 Tff7b72<< Te6edf3bitTb4b4b4)
Tff7b72if Te6edf3flags Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3criticalTb4b4b4(Ta5d6ff'Ta5d6ffWARNING: Partition definition had unknown flag(s) 0xTffd700%08xTa5d6ff. Newer binary format?Ta5d6ff' Tff7b72% Te6edf3flagsTb4b4b4)
Tff7b72return Te6edf3res
Tff7b72def Td2a8ffget_flags_listTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4[Te6edf3flag Tff7b72for Te6edf3flag Tff7b72in Tff7b72selfTff7b72.Td2a8ffFLAGSTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4) Tff7b72if Tffa657getattrTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3flagTb4b4b4)Tb4b4b4]
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3flags Tff7b72= Tffa657sumTb4b4b4(Tb4b4b4(T79c0ff1 Tff7b72<< Tff7b72selfTff7b72.Td2a8ffFLAGSTb4b4b4[Te6edf3flagTb4b4b4]Tb4b4b4) Tff7b72for Te6edf3flag Tff7b72in Tff7b72selfTff7b72.Td2a8ffget_flags_listTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffSTRUCT_FORMATTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffMAGIC_BYTESTb4b4b4,
Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsubtypeTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffoffsetTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsizeTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffnameTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3flagsTb4b4b4)
Tff7b72def Td2a8ffto_csvTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3simple_formattingTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffaddr_formatTb4b4b4(Te6edf3aTb4b4b4, Te6edf3include_sizesTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3simple_formatting Tff7b72and Te6edf3include_sizesTb4b4b4:
Tff7b72for Tb4b4b4(Te6edf3valTb4b4b4, Te6edf3suffixTb4b4b4) Tff7b72in Tb4b4b4[Tb4b4b4(T79c0ff0x100000Tb4b4b4, Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4)Tb4b4b4, Tb4b4b4(T79c0ff0x400Tb4b4b4, Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4)Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3a Tff7b72% Te6edf3val Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Ta5d6ff'Tffd700%dTffd700%sTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3a Tff7b72/Tff7b72/ Te6edf3valTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72return Ta5d6ff'Ta5d6ff0xTffd700%xTa5d6ff' Tff7b72% Te6edf3a
Tff7b72def Td2a8fflookup_keywordTb4b4b4(Te6edf3tTb4b4b4, Te6edf3keywordsTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3kTb4b4b4,Te6edf3v Tff7b72in Te6edf3keywordsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3simple_formatting Tff7b72is Tff7b72False Tff7b72and Te6edf3t Tff7b72== Te6edf3vTb4b4b4:
Tff7b72return Te6edf3k
Tff7b72return Ta5d6ff'Tffd700%dTa5d6ff' Tff7b72% Te6edf3t
Tff7b72def Td2a8ffgenerate_text_flagsTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e""" colon-delimited list of flags """
Tff7b72return Ta5d6ff'Ta5d6ff:Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_flags_listTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Ta5d6ff'Ta5d6ff,Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4,
Te6edf3lookup_keywordTb4b4b4(Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Te6edf3TYPESTb4b4b4)Tb4b4b4,
Te6edf3lookup_keywordTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsubtypeTb4b4b4, Te6edf3SUBTYPESTff7b72.Td2a8ffgetTb4b4b4(Tff7b72selfTff7b72.Td2a8fftypeTb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3addr_formatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoffsetTb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3addr_formatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsizeTb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3generate_text_flagsTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffparse_intTb4b4b4(Te6edf3vTb4b4b4, Te6edf3keywordsTff7b72=Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4:
T8b949e"""Generic parser for integer fields - int(x,0) with provision for
k/m/K/M suffixes and 'keyword' value lookup.
"""
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3letterTb4b4b4, Te6edf3multiplier Tff7b72in Tb4b4b4[Tb4b4b4(Ta5d6ff'Ta5d6ffkTa5d6ff'Tb4b4b4, T79c0ff1024Tb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff'Ta5d6ffmTa5d6ff'Tb4b4b4, T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4)Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3vTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffendswithTb4b4b4(Te6edf3letterTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3parse_intTb4b4b4(Te6edf3vTb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3keywordsTb4b4b4) Tff7b72* Te6edf3multiplier
Tff7b72return Tffa657intTb4b4b4(Te6edf3vTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3keywordsTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff'Ta5d6ffInvalid field value Tffd700%sTa5d6ff' Tff7b72% Te6edf3vTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72return Te6edf3keywordsTb4b4b4[Te6edf3vTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4]
Tff7b72except Tf85149KeyErrorTb4b4b4:
Tff7b72raise Te6edf3InputErrorTb4b4b4(Ta5d6ff"Ta5d6ffValue Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff is not valid. Known keywords: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3vTb4b4b4, Ta5d6ff'Ta5d6ff, Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3keywordsTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3quiet
Tff7b72global Te6edf3md5sum
Tff7b72global Te6edf3offset_part_table
Tff7b72global Te6edf3secure
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff'Ta5d6ffESP32 partition table utilityTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--flash-sizeTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffOptional flash size limit, checks partition table fits in flashTa5d6ff'Tb4b4b4,
Te6edf3nargsTff7b72=Ta5d6ff'Ta5d6ff?Ta5d6ff'Tb4b4b4, Te6edf3choicesTff7b72=Tb4b4b4[Ta5d6ff'Ta5d6ff1MBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff2MBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff4MBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff8MBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff16MBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff32MBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff64MBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff128MBTa5d6ff'Tb4b4b4]Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--disable-md5sumTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffDisable md5 checksum for the partition tableTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--no-verifyTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffDonTa5d6ff'Ta5d6fft verify partition table fieldsTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--verifyTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff-vTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffVerify partition table fields (deprecated, this behaviour is Ta5d6ff'
Ta5d6ff'Ta5d6ffenabled by default and this flag does nothing.Ta5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--quietTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff-qTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffDonTa5d6ff'Ta5d6fft print non-critical status messages to stderrTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--offsetTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff-oTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffSet offset partition tableTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Ta5d6ff'Ta5d6ff0x8000Ta5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--secureTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffRequire app partitions to be suitable for secure bootTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--extra-partition-subtypesTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffExtra partition subtype entriesTa5d6ff'Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff'Ta5d6ff*Ta5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ffinputTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffPath to CSV or binary file to parse.Ta5d6ff'Tb4b4b4, Tffa657typeTff7b72=Te6edf3argparseTff7b72.Td2a8ffFileTypeTb4b4b4(Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4)Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ffoutputTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffPath to output converted binary or CSV file. Will use stdout if omitted.Ta5d6ff'Tb4b4b4,
Te6edf3nargsTff7b72=Ta5d6ff'Ta5d6ff?Ta5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Ta5d6ff'Ta5d6ff-Ta5d6ff'Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Te6edf3quiet Tff7b72= Te6edf3argsTff7b72.Td2a8ffquiet
Te6edf3md5sum Tff7b72= Tff7b72not Te6edf3argsTff7b72.Td2a8ffdisable_md5sum
Te6edf3secure Tff7b72= Te6edf3argsTff7b72.Td2a8ffsecure
Te6edf3offset_part_table Tff7b72= Tffa657intTb4b4b4(Te6edf3argsTff7b72.Td2a8ffoffsetTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffextra_partition_subtypesTb4b4b4:
Te6edf3add_extra_subtypesTb4b4b4(Te6edf3argsTff7b72.Td2a8ffextra_partition_subtypesTb4b4b4)
Te6edf3tableTb4b4b4, Te6edf3input_is_binary Tff7b72= Te6edf3PartitionTableTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3argsTff7b72.Td2a8ffinputTb4b4b4)
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffno_verifyTb4b4b4:
Te6edf3statusTb4b4b4(Ta5d6ff'Ta5d6ffVerifying table...Ta5d6ff'Tb4b4b4)
Te6edf3tableTff7b72.Td2a8ffverifyTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffflash_sizeTb4b4b4:
Te6edf3size_mb Tff7b72= Tffa657intTb4b4b4(Te6edf3argsTff7b72.Td2a8ffflash_sizeTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Ta5d6ffMBTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)Tb4b4b4)
Te6edf3tableTff7b72.Td2a8ffverify_size_fitsTb4b4b4(Te6edf3size_mb Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4)
T8b949e# Make sure that the output directory is created
Te6edf3output_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3argsTff7b72.Td2a8ffoutputTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3output_dirTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3output_dirTb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72if Te6edf3excTff7b72.Td2a8fferrno Tff7b72!= Te6edf3errnoTff7b72.Td2a8ffEEXISTTb4b4b4:
Tff7b72raise
Tff7b72if Te6edf3input_is_binaryTb4b4b4:
Te6edf3output Tff7b72= Te6edf3tableTff7b72.Td2a8ffto_csvTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3sysTff7b72.Td2a8ffstdout Tff7b72if Te6edf3argsTff7b72.Td2a8ffoutput Tff7b72== Ta5d6ff'Ta5d6ff-Ta5d6ff' Tff7b72else Tffa657openTb4b4b4(Te6edf3argsTff7b72.Td2a8ffoutputTb4b4b4, Ta5d6ff'Ta5d6ffwTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3outputTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3output Tff7b72= Te6edf3tableTff7b72.Td2a8ffto_binaryTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3stdout_binary Tff7b72= Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffbuffer T8b949e# Python 3
Tff7b72except Tf85149AttributeErrorTb4b4b4:
Te6edf3stdout_binary Tff7b72= Te6edf3sysTff7b72.Td2a8ffstdout
Tff7b72with Te6edf3stdout_binary Tff7b72if Te6edf3argsTff7b72.Td2a8ffoutput Tff7b72== Ta5d6ff'Ta5d6ff-Ta5d6ff' Tff7b72else Tffa657openTb4b4b4(Te6edf3argsTff7b72.Td2a8ffoutputTb4b4b4, Ta5d6ff'Ta5d6ffwbTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3outputTb4b4b4)
Tff7b72class T56d364InputErrorTb4b4b4(Tf85149RuntimeErrorTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Te6edf3InputErrorTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Te6edf3eTb4b4b4)
Tff7b72class T56d364ValidationErrorTb4b4b4(Te6edf3InputErrorTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3partitionTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Te6edf3ValidationErrorTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(
Ta5d6ff'Ta5d6ffPartition Tffd700%sTa5d6ff invalid: Tffd700%sTa5d6ff' Tff7b72% Tb4b4b4(Te6edf3partitionTff7b72.Td2a8ffnameTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff'Ta5d6ff__main__Ta5d6ff'Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
Tff7b72except Te6edf3InputError Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Te6edf3eTb4b4b4, Te6edf3fileTff7b72=Te6edf3sysTff7b72.Td2a8ffstderrTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff2Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────